大家好,小弟目前剛自學Python,由於怕自己金魚腦,解完了上一個解到下一個時就忘記了,便想到使用寫文章的方式,一方面記錄自己的思維思考,另一方面後續複習時也比較能回到當時的思考邏輯。
由於文章中會有許多疑問與自我解答,加上小弟是初學者,如有問題建議直接發問會比較快獲得正確解答QQ
當然如果大大們有找到我內容中的錯誤點,希望能夠跟小弟說一下(Orz
(如果有引用,內容會是搜尋到的答案)
目前第一天,卡在HackerRank的Basic Data Types的Finding the percentage問題
題目為提交N分數,將N分數存為list並找到第二名,並且2<=n<=10
以下為初始的程式碼
if __name__ == '__main__':
n = int(input())
arr = map(int, input().split())
首先看到後,我的想法是map是什麼?以及我該怎麼找出亞軍?還有split的用法
map用法: map(function,list)
將「list 的全部內容」完成「對應的 function」
從而得知,原始程式碼是將input().split()這個內容,完成對應的int() function
但之前有學過,int(內容)可以將內容整數化,那為什麼不直接int(input().split())?
於是我便開始嘗試
n = int(input().split())
print((n))
得到的錯誤為
TypeError: int() argument must be a string, a bytes-like object or a real number, not 'list'
找尋報錯的原因,其中找到了
使用 int() 函式進行強制型別轉換時,要求引數x必須是字串、位元組物件、數字,不能是其它的型別
可是input不是str的資料型態嗎?為什麼不能int
所以我開始嘗試找到input()與input().spilt()這兩個資料型態
n = input()
print(type(n))
輸入1 2 3 4 5得出了是str
n = input().split()
print(type(n))
輸入1 2 3 4 5得出了是list
所以當使用者(我)input進去的東西,會是str的資料型態,而當分割後,則會形成一個list
list並不在int的型態轉換裡面,所以會報錯!
那map是什麼呢?
他能夠快速的幫助我們將「list 的全部內容」完成「對應的 function」
所以map的用法map(function,list)是指將list的內容完成function
接下來我就開始思考,int不是型態嗎?為什麼在這邊他會是function?
int() 函数用于将一个字符串或数字转换为整型。
原來int是一個資料型態,int()是一個函數!
到這邊,我就懂了初始的原始碼是在幹嘛
原來是在將輸入的n分數整數化!
那,該怎麼找出亞軍呢?
我原本的想法是,list可以更改,並且有max可以找出最大值
那我是不是能將list中的最大值找出來並remove掉,接著在執行一次max,這樣是不是就找到了亞軍?
n = int(input())
arr = map(int, input().split())
arrmax = max(arr)
arr.remove(arrmax)
print(arr)
報錯了AttributeError: 'map' object has no attribute 'remove'
找了一下這個報錯,得到了在python3中,map不會返回列表,而是返回一個迭代器對象
好的..有看沒有懂,於是將迭代器google了一下,得到了以下解答
remove是使用在list上,而map他返回的不是list,而是裡面的map裡面的元素
假設以下程式碼,input進去1 2 3 4 5,則map返回的會是1 2 3 4 5,而不是list
arr = map(int, input().split())
那我該怎麼找出亞軍呢?
我想到了迭代器是否也跟list一樣,有remove的方式可以移除
但是當我google了迭代器移除,我得知了迭代器並不能夠被移除的(但有特殊辦法可以)
到這邊後我就卡住了,因為所學中,目前尚未學習到迭代器的刪減
透過討論區後,發現有使用轉換資料型態完成代碼的的部分,在這邊目前就先使用此方式
等待後續學習到迭代器後,再重返這題並完成該題題目。
討論區中的編碼
if __name__ == '__main__':
n = int(input())
arr = map(int, input().split())
arr = sorted(list(set(arr)))
print(arr[-2])
input()會讀取一行資料 然後下一行
python input()和map()的文件
map()會將function獨立地作用於list中每個元素
e.g. map(int, ['1','2','3']) -> [int('1'),int('2'),int('3')]
假設我們input是:
5
2 3 6 6 5
if __name__ == '__main__':
print(input())
# return 5
print(input())
# return 2 3 6 6 5
print(input())
# EOFError: EOF when reading a line 沒有下一行了
下面是我對答案的理解
if __name__ == '__main__':
n = int(input()) # 讀取 '5' 轉變成 int 5
# input().split()是['2','3','6','6','5']
arr = map(int, input().split())#轉變成 mapobject [2,3,6,6,5]
arr = sorted(list(set(arr))) # set()會把重複的去除
#然後由小到大排列 [2,3,5,6]
print(arr[-2]) # return 由最後起第二個數字 5